package com.max.mongodb;

import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;

import java.util.ArrayList;
import java.util.List;

public class MongoJavaApp {
    private static final String hostname = "localhost";
    private static final int port = 27017;
    private static final String username = "admin";
    private static final String password = "123456";
    private static final String database = "admin";

    public static void main(String[] args) {
        MongoDatabase database = getConnection();
        try{
            // 创建collection
//            database.createCollection("test");

            // 选择集合
            MongoCollection<Document> collection = database.getCollection("test");
            System.out.println("集合 test 选择成功");

            // 插入数据
            /**
             * 1. 创建文档 org.bson.Document 参数为key-value的格式
             * 2. 创建文档集合List<Document>
             * 3. 将文档集合插入数据库集合中 mongoCollection.insertMany(List<Document>) 插入单个文档可以用 mongoCollection.insertOne(Document)
             * */
            Document document = new Document("title", "Mongdb title")
                    .append("description", "database")
                    .append("likes", 100)
                    .append("by", "Fly");
            ArrayList<Document> documents = new ArrayList<>();
            documents.add(document);
            collection.insertMany(documents);
            System.out.println("文档插入成功");

            // 检索所有文档
            findAllDocs(collection);

            //更新文档   将文档中likes=100的文档修改为likes=200
            collection.updateMany(Filters.eq("likes", 100), new Document("$set",new Document("likes",200)));
            findAllDocs(collection);

            //删除符合条件的第一个文档
            collection.deleteOne(Filters.eq("likes", 200));
            //删除所有符合条件的文档
            collection.deleteMany (Filters.eq("likes", 200));
            findAllDocs(collection);

        }catch(Exception e){
            System.err.println( e.getClass().getName() + ": " + e.getMessage() );
        }

    }

    /** 检索所有文档
     * 1. 获取迭代器FindIterable<Document>
     * 2. 获取游标MongoCursor<Document>
     * 3. 通过游标遍历检索出的文档集合
     * */
    public static  void findAllDocs(MongoCollection<Document> collection){
        FindIterable<Document> finditer = collection.find();
        MongoCursor<Document> mongoCursor = finditer.iterator();
        while(mongoCursor.hasNext()){
            System.out.println(mongoCursor.next());
        }

// 添加检索条件 http://mongodb.github.io/mongo-java-driver/3.0/driver/getting-started/quick-tour/
//        collection.find(and(gt("i", 50), lte("i", 100))).forEach(printBlock);
//        myDoc = collection.find(eq("i", 71)).first();
    }


    /**
     * 获取一个数据库连接
     * @return
     */
    public static MongoDatabase getConnection(){
        try {
            //连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址
            //ServerAddress()两个参数分别为 服务器地址 和 端口
            ServerAddress serverAddress = new ServerAddress(hostname,port);
            List<ServerAddress> addrs = new ArrayList<ServerAddress>();
            addrs.add(serverAddress);

            //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
            MongoCredential credential = MongoCredential.createScramSha1Credential(username, database, password.toCharArray());
            List<MongoCredential> credentials = new ArrayList<MongoCredential>();
            credentials.add(credential);

            //通过连接认证获取MongoDB连接
            MongoClient mongoClient = new MongoClient(addrs,credentials);

            //连接到数据库
            MongoDatabase mongoDatabase = mongoClient.getDatabase(database);
            System.out.println("Connect to database successfully");
            return mongoDatabase;
        } catch (Exception e) {
            System.err.println( e.getClass().getName() + ": " + e.getMessage() );
            return null;
        }
    }

}
